一、概述
Android 是由 Google 主导的基于 Linux 的开源移动操作系统,由 Open Handset Alliance (OHA) 于 2007 年发布。其设计围绕四大核心原则:
- 开放性 — AOSP(Android Open Source Project)完全开源,Apache 2.0 许可
- 平等性 — 所有应用(含系统应用和第三方应用)地位平等,均可调用系统能力
- 无界性 — 应用间可相互调用和共享数据(通过 Intent / ContentProvider)
- 快速开发 — 丰富的 Java/Kotlin Framework API,显著降低开发门槛
Android 采用分层架构,自底向上分为:Linux Kernel → HAL → Native Libraries & ART → Java API Framework → System Apps。每一层对上层提供清晰的 API,对下层屏蔽实现细节。
版本演进关键节点
| 版本 | 代号 | API | 关键变化 |
|---|---|---|---|
| 1.0 (2008) | — | 1 | 首个商用版本,含 Dalvik 虚拟机 |
| 4.4 (2013) | KitKat | 19 | ART 作为可选运行时,Project Svelte 内存优化 |
| 5.0 (2014) | Lollipop | 21 | ART 取代 Dalvik、Material Design、64位支持 |
| 8.0 (2017) | Oreo | 26 | Project Treble:框架与厂商实现解耦 |
| 10 (2019) | — | 29 | Project Mainline:通过 Google Play 更新系统模块 |
| 12 (2021) | — | 31 | Material You 动态配色,性能等级标准 |
| 14 (2023) | — | 34 | 更严格的后台限制,Health Connect |
| 15 (2024) | — | 35 | 16KB 页大小支持,卫星连接 |
二、核心用例
从用户和开发者角度,Android 系统主要提供以下核心功能。
Demo:通过 Intent 打开相机
// Kotlin: 启动系统相机拍照
val takePicture = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
if (takePicture.resolveActivity(packageManager) != null) {
startActivityForResult(takePicture, REQUEST_IMAGE_CAPTURE)
}
// 接收结果
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
val imageBitmap = data?.extras?.get("data") as Bitmap
imageView.setImageBitmap(imageBitmap)
}
}
三、系统启动流程
Android 设备上电到显示桌面(Launcher),经过如下阶段:
| 阶段 | 组件 | 职责 |
|---|---|---|
| 1. Boot ROM | 芯片固件 | 上电重置,加载 Bootloader 到 RAM |
| 2. Bootloader | LK / U-Boot | 初始化 RAM、存储、显示,加载 Linux Kernel |
| 3. Linux Kernel | 内核 + 驱动 | 挂载根文件系统,启动 init 进程(PID 1) |
| 4. init 进程 | init + rc 脚本 | 挂载分区,启动守护进程(servicemanager、vold 等) |
| 5. Zygote | app_process | 预加载 Framework 类 + 资源,孵化新应用进程 |
| 6. SystemServer | system_server | 启动所有系统服务(AMS、WMS、PKMS 等) |
| 7. Launcher | Launcher3 | 显示桌面,完成启动 |
四、App 启动流程
用户点击桌面图标到 Activity 显示,完整调用链如下。
五、Activity 生命周期
Activity 是 Android 应用最基本的表现组件。系统通过回调方法管理其从创建到销毁的完整生命周期,并在配置变化或内存紧张时重建。
Demo:生命周期回调
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.d(TAG, "onCreate")
}
override fun onStart() { super.onStart(); Log.d(TAG, "onStart") }
override fun onResume() { super.onResume(); Log.d(TAG, "onResume") }
override fun onPause() { super.onPause(); Log.d(TAG, "onPause") }
override fun onStop() { super.onStop(); Log.d(TAG, "onStop") }
override fun onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy") }
override fun onRestart() { super.onRestart(); Log.d(TAG, "onRestart") }
}
六、系统分层架构
Android 采用经典的 5 层架构,自下而上为:
各层详细说明
| 层 | 组成 | 职责 |
|---|---|---|
| Linux Kernel | Linux 内核(Android Common Kernel)+ 驱动 + Binder / ashmem / lowmemorykiller 等 Android 定制 | 硬件抽象、进程管理、内存管理、安全(SELinux)、网络 |
| HAL | 硬件抽象层(HIDL/AIDL 定义),各厂商 .so 实现 | 为 Framework 提供统一硬件访问接口,隔离厂商差异 |
| Native Libraries & ART | libc(Bionic)、SQLite、OpenGL ES、WebKit(Chromium)、Media Framework;ART 虚拟机 | 提供 C/C++ 底层能力;编译并执行 DEX 字节码 |
| Java API Framework | ActivityManager、WindowManager、PackageManager、ContentProvider 等系统服务 | 暴露 Java/Kotlin API 供应用调用 |
| System Apps | Launcher、Phone、Contacts、Settings 等 | 用户可见的系统级应用 |
七、Binder IPC 机制
Binder 是 Android 独有的进程间通信 (IPC) 机制,基于 OpenBinder 项目(Be Inc. 遗产)。它是整个 Framework 的通信总线:系统服务通过 Binder 向 App 暴露功能,App 间也可通过 Binder 通信。
Binder 关键对象:Binder Driver(内核驱动 /dev/binder,负责数据搬运,单次最大 1MB - 8KB 缓冲区开销)、ServiceManager(充当 DNS 角色,服务名为键)、Binder Proxy / Stub(Java/Kotlin 代理模式实现)。Binder 线程池上限 16 个,独立于应用主线程。
Demo:AIDL 定义远程服务
// IMusicPlayer.aidl
interface IMusicPlayer {
void play(String uri);
void pause();
boolean isPlaying();
}
// 服务端实现
class MusicService : Service() {
private val binder = object : IMusicPlayer.Stub() {
override fun play(uri: String?) { /* 播放逻辑 */ }
override fun pause() { /* 暂停逻辑 */ }
override fun isPlaying(): Boolean = mediaPlayer.isPlaying
}
override fun onBind(intent: Intent?) = binder
}
// 客户端绑定
bindService(Intent(this, MusicService::class.java), serviceConnection, BIND_AUTO_CREATE)
val player = IMusicPlayer.Stub.asInterface(serviceConnection.service)
Binder vs 其他 IPC 对比
| 特性 | Binder | Socket | 共享内存 |
|---|---|---|---|
| 数据拷贝次数 | 1 次 | 2 次 | 0 次 |
| 调用方式 | 同步 RPC | 流式 | 需额外同步 |
| 安全性 | UID/PID 可信校验 | 无内置身份 | 无内置身份 |
| Android 主要用途 | 系统服务 / 应用间 RPC | Zygote / adbd / 网络 | 图形缓冲区 / ashmem |
八、Android Runtime (ART)
ART 在 Android 5.0 中取代了 Dalvik 虚拟机,从 JIT (Just-In-Time) 转向 AOT (Ahead-Of-Time) 编译。Android 7.0 引入混合编译(Profile-guided JIT + AOT),平衡安装速度和运行时性能。
混合编译流程:
- 安装时仅做轻量 verify(验证字节码合法性)
- 首次运行时通过 JIT 解释 + 热点编译
- 空闲时 dex2oat 根据 Profile 对热点代码做 AOT 编译为 .odex
- 重启后优先加载 AOT 编译的机器码,未编译代码继续解释执行
ART vs Dalvik 对比
| 特性 | Dalvik | ART |
|---|---|---|
| 编译方式 | JIT(运行时逐条编译) | AOT + JIT 混合 |
| 安装时间 | 快 | 较快(仅 verify) |
| 启动速度 | 慢(冷启动需 JIT) | 快(有 AOT 缓存时) |
| 运行时性能 | 较低 | 较高 |
| 内存占用 | 较小 | 较大(含 AOT 代码) |
| GC | STW(暂停所有线程) | 并发压缩 GC |
九、HAL 硬件抽象层
HAL 将硬件功能封装为标准接口,Framework 层通过 HAL 接口调用硬件而不需要关心厂商的实现差异。Android 8.0 引入 HIDL (HAL Interface Definition Language),Android 11+ 迁移至 AIDL。
9.1 Project Treble(框架/厂商解耦)
Android 8.0 引入 Project Treble,将厂商实现(Vendor Implementation)与 Android 框架分离:
- VINTF (Vendor Interface) — 以 XML 声明 Framework 对 HAL 的版本要求,设备启动时校验兼容性
- HIDL/AIDL HAL — Framework 与 HAL 在不同进程运行,通过 Binder 通信,Framework 升级不再需要重新编译 HAL
- VNDK — Vendor Native Development Kit,厂商可用的稳定 NDK 子集
十、Framework 核心类
Android Framework 以系统服务为核心,最常见的 8 大核心服务:
这些服务运行在 system_server 进程内,通过 Binder 向 App 进程暴露功能。每个服务都以 Manager 类的形式封装对外 API:
| Manager 类 (App 侧) | 对应系统服务 | 关键功能 |
|---|---|---|
ActivityManager | AMS (ActivityManagerService) | Activity/Service/BroadcastReceiver/Provider 生命周期管理 |
WindowManager | WMS (WindowManagerService) | 窗口显示、层级(Z-Order)、输入事件分发 |
PackageManager | PKMS (PackageManagerService) | APK 安装、权限管理、组件查询 |
NotificationManager | NotificationManagerService | 通知栏管理 |
LocationManager | LocationManagerService | GPS/网络定位 |
ConnectivityManager | ConnectivityService | 网络/WiFi/蓝牙连接管理 |
SensorManager | SensorService | 加速度计、陀螺仪等传感器 |
AlarmManager | AlarmManagerService | 定时任务、闹钟 |
Demo:获取系统服务
// Kotlin: 通过 Context 获取系统服务
val am = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val memInfo = ActivityManager.MemoryInfo()
am.getMemoryInfo(memInfo)
Log.d(TAG, "Available Memory: ${memInfo.availMem / 1024 / 1024} MB")
val wm = getSystemService(Context.WINDOW_SERVICE) as WindowManager
val display = wm.defaultDisplay
val metrics = DisplayMetrics()
display.getRealMetrics(metrics)
Log.d(TAG, "Screen: ${metrics.widthPixels}x${metrics.heightPixels} @ ${metrics.densityDpi}dpi")
十一、包图:源码结构
AOSP 源码主要包的依赖关系:
AOSP 关键源码目录
| 目录 | 内容 | Git 仓库 |
|---|---|---|
frameworks/base/ | 核心 Framework(AMS、WMS、PKMS 等) | platform/frameworks/base |
packages/apps/ | 系统应用(Launcher3、Settings 等) | platform/packages/apps/* |
art/ | ART 运行时 | platform/art |
system/core/ | init、logcat、adbd、servicemanager | platform/system/core |
hardware/interfaces/ | HIDL/AIDL HAL 接口定义 | platform/hardware/interfaces |
bionic/ | Android C 库(替代 glibc) | platform/bionic |
external/ | 第三方库(SQLite、libjpeg 等) | platform/external/* |
build/ | Soong 构建系统(Blueprints + Go) | platform/build |
十二、安全模型
Android 安全基于纵深防御原则,多层防护互相叠加。
| 层级 | 机制 | 说明 |
|---|---|---|
| 应用沙箱 | Linux UID 隔离 | 每个 App 分配独立 UID,文件系统权限隔离;默认无法读取其他 App 的私有数据 |
| 权限系统 | AndroidManifest.xml 声明 | 危险权限(相机、位置等)需运行时动态申请 + 用户授权;Android 11+ 支持一次性权限和自动重置 |
| SELinux | 强制访问控制 (MAC) | 所有进程(含 root)均受 SELinux 策略约束,默认 Deny All;Android 4.3 引入,5.0 强制 Enforcing |
| Verified Boot | dm-verity / AVB | 启动时逐块校验系统分区的完整性,防篡改 |
| 应用签名 | APK 签名 (v1/v2/v3/v4) | 安装时校验签名;同签名 App 可共享 UID 和数据 |
| ASLR + PIE + NX | 内核安全特性 | 地址随机化、位置无关代码、栈不可执行,防御内存漏洞利用 |
| File-based Encryption | FBE (Direct Boot) | 单个文件级别加密,比全盘加密 (FDE) 更灵活 |
十三、总结
Android 通过分层架构(Kernel → HAL → Native → Framework → App)实现了硬件无关性与开发便捷性的平衡。其设计有三个关键特点:
- Binder 作为通信总线 — 所有系统服务通过 Binder 暴露,形成统一的 RPC 架构,一次拷贝零拷贝传输
- 组件作为基本单元 — Activity、Service、BroadcastReceiver、ContentProvider 四大组件构成应用骨架,通过 Intent 解耦组件间通信
- Zygote 孵化模型 — 父进程预加载 Framework 类和资源,fork 子进程时共享内存页(Copy-on-Write),显著加速 App 冷启动
从 Project Treble 的框架/厂商解耦到 Project Mainline 的模块化更新,从 Dalvik JIT 到 ART 混合编译,Android 持续演进其架构以适应多样化设备(手机、平板、手表、车机、TV、IoT)。
来源:source.android.com · developer.android.com · cs.android.com (AOSP Code Search) · 更新:2025-07